chcp 65001
@echo off
:: 检查权限 
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"  
  
:: 如果上一条语句执行返回错误标志为 0，则表示当前非管理员权限运行
if '%errorlevel%' NEQ '0' (  
    echo 正在请求管理员权限...  
    goto UACPrompt  
) else ( goto gotAdmin )  
  
:UACPrompt  
    :: 创建并执行vbs脚本
    echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"  
    echo UAC.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs"  
    "%temp%\getadmin.vbs"  
    exit /B  
  
:gotAdmin  
    :: 删除获取权限的vbs脚本
    if exist "%temp%\getadmin.vbs" ( del "%temp%\getadmin.vbs" )  
    pushd "%CD%"  
    CD /D "%~dp0"  

:: 允许变量延迟扩展
setlocal enabledelayedexpansion
title 关闭端口对应进程
echo 请谨慎操作，关闭某些特殊的进程可能会带来一些不稳定因素
set /p value=请输入端口号:
set a=0
for /f "tokens=*" %%i in ('netstat -aon ^| findstr "%value%"') do (
    set a=%%i
    set a=!a:~69,10!
)
:: 判断是否得到了进程id
if %a% equ 0 (
goto cannotGetPid
) else (
goto gotPid
)
:gotPid
:: 获取任务列表对应的任务名，以便判断需要结束的进程是否是期望值
for /f "tokens=*" %%i in ('tasklist ^| findstr "%a%"') do (
    set b=%%i
    set b=!b:~0,20!
)
:: 去除左边空格
:intercept_b
if "%b:~-1%"==" " set "b=%b:~0,-1%"&goto intercept_b
color c
set /p in=已找到端口 %value% 的相关进程 %b%, 请 #谨慎# 决定是否结束该进程？(y/n)
color f
:: 强行结束进程
if '%in%' == 'y' (
    taskkill /F /pid %a%
    echo 已结束进程, 按任意键退出
) else (
    echo 放弃执行, 按任意键退出
)
pause>nul
exit

:cannotGetPid
echo 未找打端口号 %value% 的相关进程, 按任意键退出
pause>nul
exit